<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
function Teacher(major, name, height, weight) {
  this.major = major;
  this.name = name;
  this.height = height;
  this.weight = weight;
}

// 往Teacher 中，增加 实例方法；加到 原型对象 当中
// Teacher.prototype.sayHi = function() {
//   console.log(`你好呀, 我叫 ${this.name}`);
// }


// const liShi = new Teacher('汉语言文学', '李师师', '160cm', '55kg');

// const suXiaoWan = new Teacher('汉语言文学', '苏小婉', '157cm', '55kg');

// // liShi.__proto__.sayHi === suXiaoWan.__proto__.sayHi  不同的实例对象，共用一个「方法」
// console.log(liShi, suXiaoWan);



function Student(level, name, height, weight) {
  this.level = level;
  this.name = name;
  this.height = height;
  this.weight = weight;
}

// 往 Student 中，增加 实例方法
// Student.prototype.sayHi = function() {
//   console.log(`你好呀，我叫${this.name}`);
// }


// 若 对 Student  和 Teacher，从 DRY / 代码复用性的角度，考虑：
  // Student.prototype.sayHi  与 Teacher.prototype.sayHi 重复了
    // 那么，如何对他们 进行 DRY - 即代码复用
      // 解决方法： 原型继承
        // 技术思路：为 Student  和 Teacher 创建一个「父类」，将 sayHi 提取到父类当中
          // Student  和 Teacher 同时「继承」父类的 sayHi，以达到 共享 同一方法的目的

// Animal 可以人为是 Person 的父类：
function Animal() {}
Animal.prototype.run = function() {
  console.log('ho ho run...');
}

// 技术实现：
// 创建 Student 的 「父类」：Person
function Person() {}
Person.prototype = new Animal(); // 让 Person 可以「继承」其父类的 实例方法
Person.prototype.constructor = Person;
Person.prototype.sayHi = function() {
  console.log(`你好呀，我叫${this.name}`);
}
//  Student  和 Teacher 继承 父类的 实例方法：
Student.prototype = new Person(); // Student 的所有实例，共享 new Teacher() 上的 属性 和 方法
Student.prototype.constructor = Student; // 将 Student 的 constructor 重新指向自己


// 验证 Student 的实例对象上，能否继承 Person 上 sayHi 的方法：
const xiaoMing = new Student('5年级', '小明', '167cm', '60kg');

xiaoMing.sayHi(); // 实现了 Student 的实例对象，继承了 父类 Person 上的 实例方法


// 总结上面的原型链：
xiaoMing.__proto__ // 指向 Student.prototype
xiaoMing.__proto__.__proto__ // 指向 Person.prototype
xiaoMing.__proto__.__proto__.__proto__ // 指向 Animal.prototype
xiaoMing.__proto__.__proto__.__proto__.__proto__ // 指向 Object.prototype
// 总结：xiaoMing 该对象的原型链上，一共有 四个 原型对象，构成了其原型链。
  // 只要是 实例对象，即 所用的方法，若原型链上有，则 该 实例对象，就能拿到 原型链 上的 属性 或 方法
xiaoMing.run();


</script>